package cn.itsource.order;

import cn.itsource.basic.domain.aplipayCommon.AlipayConfig;
import cn.itsource.basic.domain.aplipayCommon.AlipayParams;
import cn.itsource.order.domain.OrderDTO;
import cn.itsource.order.domain.TOrderAdopt;
import cn.itsource.order.service.OrderAdoptService;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.client.RestClientTest;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@RestController
public class OrderController {
    @Autowired
    OrderAdoptService orderAdoptService;

    @Autowired
    private AlipayParams alipayParams;
    @PostMapping("/order/createorder")
    public String createOrder(@RequestBody OrderDTO orderDTO){
        //
       return orderAdoptService.createOrder(orderDTO);


    }



    /**
     * 获取宠物信息的接口
     */
    @RequestMapping("pay/notifyUrl")
    public String notifyUrl(HttpServletRequest request){
        System.out.println(">>>>>>>>>notifyUrl>>>>>>>");

        try {
            //获取支付宝POST过来反馈信息(返回的结果非常的多，需要程序自行解析)
            Map<String, String> params = new HashMap<String, String>();
            Map<String, String[]> requestParams = request.getParameterMap();
            //1. 将回调请求中，携带的参数，进行转换，全部转为 HashMap<String,String>的格式
            for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
            }

            //2. 转换之后，注意：有1个核心返回值：trade_status ---->值为 TRADE_SUCCESS 说明 ，支付成功
            //获取appid
            //String app_id = params.get("app_id");
            //String alipay_public_key = params.get("alipay_public_key");
            //获取支付信息对象
//           TPayAlipayInfo alipayInfo = alipayInfoService.loadByAppid(app_id);
            //主要用于校验
            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayParams.getAlipayPublicKey(), AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

            //——请在这里编写您的程序（以下代码仅作参考）——

            /* 实际验证过程建议商户务必添加以下校验：
            1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
            2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
            3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
            4、验证app_id是否为该商户本身。
            */
            if (signVerified) {//验证成功
                //商户订单号
                String out_trade_no = request.getParameter("out_trade_no");
                //支付宝交易号（这个参数，是支付宝方支付成功后，生成的一个支付交易单号。主要用于：对帐）
                String trade_no = request.getParameter("trade_no");
                //交易状态
                String trade_status = request.getParameter("trade_status");
                //交易成功
                if (trade_status.equals("TRADE_SUCCESS")) {
                    //这里将是处理支付成功之后的，业务逻辑
                    // TODO: 2022/3/8  这里就应该查询订单信息,改变订单状态
                    TOrderAdopt orderAdopt = orderAdoptService.findByOrderSn(out_trade_no);
                    orderAdopt.setState(1);
                    orderAdopt.setPaySn(trade_no);
                    orderAdopt.setLastPayTime(new Date());
                    orderAdoptService.update(orderAdopt);
                    System.out.println("进入if判断");
                    return "success";
                }
                System.out.println("没有进入if判断");
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "failure";
    }
}
